{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "d1f20875-c50d-46df-906b-49ec1d0c6002",
   "metadata": {},
   "source": [
    "# 8.9 使用正则化缓解过拟合\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "c90a18b9-d8e8-431c-856c-35f1e4ed05e1",
   "metadata": {},
   "source": [
    "### 1.任务描述\n",
    "\n",
    "在文件/project08/dot.csv中，有3列数据，$x_1,x_2$，y_c，其中，$x_1$和$x_2$是样本特征；y_c是样本标签，取值为0或1。\n",
    "\n",
    "要求：\n",
    "\n",
    "1. 构建一个神经网络，拟合输入特征（$x_1$和$x_2$）与标签y_c的关系\n",
    "2. 要求将新的数据$x_1$和$x_2$送入神经网络，网络经过前向传播，输出预测值，自动判断是为1的可能性大，还是为0的可能性大\n",
    "3. 把$x_1$、$x_2$分别作为横、纵坐标，将数据可视化输出，标签为1的，为星形点；标签为0的，为x形点\n",
    "4. 根据模型的输出，绘制出一条线，区分星形点和x形点"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "f5b4fc39-cbcf-432a-bf1e-e75e642d4b87",
   "metadata": {},
   "source": [
    "### 2.知识准备\n",
    "\n",
    "见教程。\n",
    "   "
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "c1d0295a-4ac4-470a-8263-027a3d69ac2c",
   "metadata": {},
   "source": [
    "### 3.任务分析\n",
    "\n",
    "先用神经网络拟合出特征$x_1$和$x_2$与标签的函数关系，然后生成网络，覆盖这些点，把网络的交点（横、纵坐标）作为输入，送入训练好的神经网络，网络会为每个坐标输出一个预测值。\n",
    "\n",
    "要区分输出是偏向1还是偏向0，可以把神经网络输出预测值为0.5的线标出颜色，这条线就是0（x形点）和1（星形点）的分界线。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "435c6090-cfda-4f46-a550-22a368e41e4a",
   "metadata": {},
   "source": [
    "### 4.任务实施\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "ec75eb6c-5da3-467d-a471-ca3b47242dd6",
   "metadata": {},
   "source": [
    "执行代码"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "2ae9da58-e339-4d22-9f8d-ca255711d89e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch: 0 loss: 5.162293434143066\n",
      "epoch: 50 loss: 0.5135178565979004\n",
      "epoch: 100 loss: 0.39526358246803284\n",
      "epoch: 150 loss: 0.3174248933792114\n",
      "epoch: 200 loss: 0.26262301206588745\n",
      "epoch: 250 loss: 0.22386202216148376\n",
      "epoch: 300 loss: 0.19726844131946564\n",
      "epoch: 350 loss: 0.17903214693069458\n",
      "epoch: 400 loss: 0.16709265112876892\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import tensorflow as tf\n",
    "from matplotlib import pyplot as plt\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "# 1，数据处理\n",
    "# 读取数据\n",
    "df = pd.read_csv('dot.csv')\n",
    "x_data = np.array(df[['x1', 'x2']])\n",
    "y_data = np.array(df['y_c']).reshape(-1, 1)\n",
    "# 转换类型\n",
    "x_train = tf.cast(x_data, tf.float32)\n",
    "y_train = tf.cast(y_data, tf.float32)\n",
    "\n",
    "# 标签为1标为星形，标签为0标为x形\n",
    "Y_m = [['*' if y else 'x'] for y in y_train]\n",
    "\n",
    "# 生成数据集\n",
    "train_db = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(64)\n",
    "\n",
    "# 2，参数设置\n",
    "# 参数初始化\n",
    "w1 = tf.Variable(tf.random.normal([2, 11]), dtype=tf.float32)\n",
    "b1 = tf.Variable(tf.constant(0.01, shape=[11]), dtype=tf.float32)\n",
    "w2 = tf.Variable(tf.random.normal([11, 1]), dtype=tf.float32)\n",
    "b2 = tf.Variable(tf.constant(0.01, shape=[1]), dtype=tf.float32)\n",
    "# 超参数\n",
    "lr = 0.01\n",
    "epoch = 400\n",
    "REGULARIZER = 0.03\n",
    "# 3，训练\n",
    "for epoch in range(epoch+1):\n",
    "    for step, (x_train, y_train) in enumerate(train_db):\n",
    "        with tf.GradientTape() as tape:\n",
    "            # 第一层线性结果\n",
    "            h1 = tf.matmul(x_train, w1) + b1 \n",
    "            # 第一层激活函数\n",
    "            h1 = tf.nn.relu(h1)\n",
    "            # 第二层线性结果\n",
    "            y = tf.matmul(h1, w2) + b2            \n",
    "            # 3.1，不使用正则化\n",
    "            # start1\n",
    "            # loss = tf.reduce_mean(tf.square(y_train - y))\n",
    "            # end1            \n",
    "   \n",
    "            # 3.2，使用L2正则化\n",
    "            # start2\n",
    "            loss_mse = tf.reduce_mean(tf.square(y_train - y)) \n",
    "            loss_regularization = []\n",
    "            loss_regularization.append(tf.keras.regularizers. l2(REGULARIZER)(w1))\n",
    "            loss_regularization.append(tf.keras.regularizers. l2(REGULARIZER)(w2))\n",
    "            loss_regularization = tf.reduce_sum(loss_regularization)\n",
    "            loss = loss_mse + loss_regularization \n",
    "            # end2            \n",
    "            \n",
    "        # 计算Loss对各个参数的梯度\n",
    "        grads = tape.gradient(loss, [w1, b1, w2, b2])\n",
    "        w1.assign_sub(lr * grads[0]) \n",
    "        b1.assign_sub(lr * grads[1])\n",
    "        w2.assign_sub(lr * grads[2])\n",
    "        b2.assign_sub(lr * grads[3])\n",
    "\n",
    "    # 打印每200个epoch的Loss信息\n",
    "    if epoch % 50 == 0:\n",
    "        print('epoch:', epoch, 'loss:', float(loss))\n",
    "        \n",
    "# 4，预测\n",
    "# 生成网格坐标点\n",
    "xx, yy = np.mgrid[-3:3:.1, -3:3:.1]\n",
    "# 将xx, yy拉直，合并配对为二维张量，生成二维坐标点\n",
    "grid = np.c_[xx.ravel(), yy.ravel()]\n",
    "grid = tf.cast(grid, tf.float32)\n",
    "# 进行预测，probs为输出\n",
    "probs = []\n",
    "for x_predict in grid:\n",
    "    # 使用训练好的参数进行预测\n",
    "    h1 = tf.matmul([x_predict], w1) + b1\n",
    "    h1 = tf.nn.relu(h1)\n",
    "    y = tf.matmul(h1, w2) + b2\n",
    "    probs.append(y)\n",
    "\n",
    "# 5，可视化\n",
    "# 输出样本特征数据散点图\n",
    "x1 = x_data[:,0]\n",
    "x2 = x_data[:,1]\n",
    "Y_m = np.squeeze(Y_m)\n",
    "for i in range(len(x1)):\n",
    "    if (Y_m[i] == '*'):\n",
    "        plt.scatter(x1[i], x2[i], marker=Y_m[i],c='r')\n",
    "    else:\n",
    "        plt.scatter(x1[i], x2[i], marker=Y_m[i],c='b')\n",
    "# 基于xx、yy和对应的值probs绘制等高线，给probs值为0.5的点上色，作为x形点与星形点的分界线\n",
    "probs = np.array(probs).reshape(xx.shape)\n",
    "plt.contour(xx, yy, probs, levels=[.5])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e3b3e36e-8418-4caf-af51-d8ac80e2a321",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
